package de.g18.gruppe3.common.ldap;

import java.util.List;

import de.g18.gruppe3.common.exception.OrganizationalUnitAlreadyExistsException;
import de.g18.gruppe3.common.exception.OrganizationalUnitNotFoundException;
import de.g18.gruppe3.common.exception.ServiceException;
import de.g18.gruppe3.common.model.OrganizationalUnit;

/**
 * LDAP-Schnittstelle zum arbeiten mit Organisationseinheiten.
 *
 * @author <a href="mailto:kevinhuber.kh@gmail.com">Kevin Huber</a>
 */
public interface OrganizationalUnitService {

    /**
     * Gibt eine Liste aller Organisationseinheiten zurück
     */
    List<OrganizationalUnit> getAllOrganizationalUnits();

    /**
     * Sucht eine Organisationseinheit anhand ihres namens
     *
     * @param aName Name der Organisationseinheit die gesucht werden soll
     */
    OrganizationalUnit getOrganizationalUnitByName(String aName) throws ServiceException, OrganizationalUnitNotFoundException;

    /**
     * Erstellt eine neue Organisationseinheit
     *
     * @param aOU Organisationseinheit die erstellt werden soll
     * @return Das persistierte Organisationseinheit-Objekt
     *
     * @throws OrganizationalUnitAlreadyExistsException Falls bereits eine Organisationseinheit mit dem selben Namen existiert
     * @throws ServiceException
     */
    OrganizationalUnit createOrganizationalUnit(OrganizationalUnit aOU) throws ServiceException, OrganizationalUnitAlreadyExistsException;

    /**
     * Löscht eine Organisationseinheit
     *
     * @param aOU Organisationseinheit die gelöscht werden soll
     */
    void deleteOU(OrganizationalUnit aOU) throws ServiceException;
}
